﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using ProyectoVuelos.Entidades;
using MySql.Data.MySqlClient;
using System.Data;
using ProyectoVuelos.Acceso_a_Datos.Conexion;
using ProyectoVuelos.Logica.Excepciones;

namespace ProyectoVuelos.Acceso_a_Datos.Mysql
{
    public class MySQLRegistroUsuario
    {

        #region Atributos

        ConexionMySQL conexion = new ConexionMySQL();
        private Usuario _miUsuario;
        private List<Compra> _milistaCompra;
        private Compra _miCompra;

        #endregion

        #region Métodos


        /// <summary>
        /// Valida que el pasaporte no corresponda ya a otro usuario
        /// </summary>
        /// <param name="pasaporte"></param>
        /// <returns></returns>
        public bool ValidarPasaporte(string pasaporte)
        {
            bool respuesta = false;

            try
            {
                conexion = new ConexionMySQL();
                conexion.abrirConexion();
                MySqlCommand command = new MySqlCommand("validarPasaporte",conexion.getConexion());
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@Pasaporte", pasaporte);

                MySqlDataReader reader = command.ExecuteReader();

                if (reader.Read())
                    respuesta = true;

                reader.Close();
                conexion.cerrarConexion();
            }
            catch (MySqlException ex)
            {
                throw new BDCompraVueloExcepcion("ERROR:Ocurrio un error en la ejecucion del requerimiento:" + ex.Message);
            }
            finally
            {
                this.conexion.cerrarConexion();

            }
            return respuesta;
        }

        /// <summary>
        /// Para hacer el insert en cuenta necesito la foranea del la persona,
        /// usando el mismo procedure de validar pasaporte, obtengo el id
        /// de la persona
        /// </summary>
        /// <param name="pasaporte"></param>
        /// <returns></returns>
        public int ForaneaPersona(string pasaporte)
        {
            int respuesta = 0;

            try
            {
                conexion = new ConexionMySQL();
                conexion.abrirConexion();
                MySqlCommand command = new MySqlCommand("validarPasaporte", conexion.getConexion());           
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@Pasaporte", pasaporte);
                //command.ExecuteNonQuery();

                MySqlDataReader reader = command.ExecuteReader();

                if (reader.Read())
                    respuesta = Convert.ToInt16(reader.GetValue(0));

                reader.Close();
                conexion.cerrarConexion();
            }
            catch (MySqlException ex)
            {
                throw new BDCompraVueloExcepcion("ERROR:Ocurrio un error en la ejecucion del requerimiento:" + ex.Message);
            }
            finally
            {
                this.conexion.cerrarConexion();

            }
            return respuesta;
        }

        /// <summary>
        /// Insertar Usuario
        /// </summary>
        /// <param name="usuario"></param>
        /// <returns></returns>
        public bool InsertarUsuario(Usuario usuario)
        {
            bool respuesta = false;

            try
            {
                conexion = new ConexionMySQL();
                conexion.abrirConexion();
                MySqlCommand command = new MySqlCommand("pepe", conexion.getConexion());
                command.CommandType = System.Data.CommandType.StoredProcedure;
                //command.CommandText = "[dbo].[pepe]";
                //command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@idPersona", "");
                command.Parameters.AddWithValue("@Pasaporte", usuario.Pasaporte);
                command.Parameters.AddWithValue("@Cedula", usuario.Cedula);
                command.Parameters.AddWithValue("@Nombre", usuario.Nombre);
                command.Parameters.AddWithValue("@Segundo_nombre", usuario.SegundoNombre);
                command.Parameters.AddWithValue("@Apellido", usuario.Apellido);
                command.Parameters.AddWithValue("@Segundo_apellido", usuario.SegundoApellido);
                command.Parameters.AddWithValue("@FechaNac", usuario.FechaNacimiento);
                command.Parameters.AddWithValue("@Telefono", usuario.Telefono);
                command.Parameters.AddWithValue("@Email", usuario.Email);  
                command.Parameters.AddWithValue("@Sexo", usuario.Sexo);



                command.Parameters["@idPersona"].Direction = ParameterDirection.Input; ;
                command.Parameters["@Pasaporte"].Direction = ParameterDirection.Input;
                command.Parameters["@Cedula"].Direction = ParameterDirection.Input;
                command.Parameters["@Nombre"].Direction = ParameterDirection.Input;
                command.Parameters["@Segundo_nombre"].Direction = ParameterDirection.Input;
                command.Parameters["@Apellido"].Direction = ParameterDirection.Input;
                command.Parameters["@Segundo_apellido"].Direction = ParameterDirection.Input;
                command.Parameters["@FechaNac"].Direction = ParameterDirection.Input;
                command.Parameters["@Telefono"].Direction = ParameterDirection.Input;
                command.Parameters["@Email"].Direction = ParameterDirection.Input;
                command.Parameters["@Sexo"].Direction = ParameterDirection.Input;

                command.ExecuteNonQuery();

            }
            catch (MySqlException ex)
            {
                respuesta = false;
                throw new BDCompraVueloExcepcion("ERROR:Ocurrio un error en la ejecucion del requerimiento:" + ex.Message);
            }
            finally
            {
                respuesta = true;
                this.conexion.cerrarConexion();

            }
            return respuesta;

        }

        /// <summary>
        /// Insert de cuenta con la foranea de la persona a la que
        /// esta asociada la cuenta.
        /// </summary>
        /// <param name="cuenta"></param>
        /// <param name="foranea"></param>
        /// <returns></returns>
        public bool InsertarCuenta(Cuenta cuenta, int foranea)
        {
            bool respuesta = false;

            try
            {
                conexion = new ConexionMySQL();
                conexion.abrirConexion();
                MySqlCommand command = new MySqlCommand("insertarCuenta", conexion.getConexion());           
                command.CommandType = System.Data.CommandType.StoredProcedure;
                //command.CommandText = "[dbo].[insertarCuenta]";
                //command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@idCuenta", "");
                command.Parameters.AddWithValue("@Login", cuenta.Nombre);
                command.Parameters.AddWithValue("@contrasena", cuenta.Clave);
                command.Parameters.AddWithValue("@fkpersona_cuenta", foranea);


                command.Parameters["@idCuenta"].Direction = ParameterDirection.Input; ;
                command.Parameters["@Login"].Direction = ParameterDirection.Input;
                command.Parameters["@contrasena"].Direction = ParameterDirection.Input;
                command.Parameters["@fkpersona_cuenta"].Direction = ParameterDirection.Input;

                command.ExecuteNonQuery();

                //MySqlDataReader reader = command.ExecuteReader();

            }
            catch (MySqlException ex)
            {
                respuesta = false;
                throw new BDCompraVueloExcepcion("ERROR:Ocurrio un error en la ejecucion del requerimiento:" + ex.Message);
            }
            finally
            {
                respuesta = true;
                this.conexion.cerrarConexion();

            }
            return respuesta;

        }

        /// <summary>
        /// Valida que la cuenta y la clave existan
        /// </summary>
        /// <param name="pasaporte"></param>
        /// <returns></returns>
        public bool ValidarCuenta(string cuenta, string clave)
        {
            bool respuesta = false;

            try
            {
                conexion = new ConexionMySQL();
                conexion.abrirConexion();
                MySqlCommand command = new MySqlCommand("validarCuenta", conexion.getConexion());
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@Cuenta", cuenta);
                command.Parameters.AddWithValue("@Clave", clave);

                MySqlDataReader reader = command.ExecuteReader();

                if (reader.Read())
                    respuesta = true;

                reader.Close();
                conexion.cerrarConexion();
            }
            catch (MySqlException ex)
            {
                throw new BDCompraVueloExcepcion("ERROR:Ocurrio un error en la ejecucion del requerimiento:" + ex.Message);
            }
            finally
            {
                this.conexion.cerrarConexion();

            }
            return respuesta;
        }

        /// <summary>
        /// retorna el id de la persona por medio del login de la
        /// cuenta
        /// </summary>
        /// <param name="pasaporte"></param>
        /// <returns></returns>
        public int RetornoIdCuenta(string cuenta)
        {
            int respuesta = 0;

            try
            {
                conexion = new ConexionMySQL();
                conexion.abrirConexion();
                MySqlCommand command = new MySqlCommand("RetornoIdCuenta", conexion.getConexion());
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@Cuenta", cuenta);

                MySqlDataReader reader = command.ExecuteReader();

                if (reader.Read())
                    respuesta = Convert.ToInt16(reader.GetValue(0));

                reader.Close();
                conexion.cerrarConexion();
            }
            catch (MySqlException ex)
            {
                throw new BDCompraVueloExcepcion("ERROR:Ocurrio un error en la ejecucion del requerimiento:" + ex.Message);
            }
            finally
            {
                this.conexion.cerrarConexion();

            }
            return respuesta;
        }

        /// <summary>
        /// Con la foranea obtenida por el login de la cuenta, creo el objeto
        /// usuario con los datos necesarios a colocar en la pagina de mostrar
        /// las compras
        /// </summary>
        /// <param name="FkPersonaCuenta"></param>
        /// <returns></returns>
        public Usuario RetornoPersonaPorIdCuenta(int FkPersonaCuenta)
        {
            try
            {
                conexion = new ConexionMySQL();
                conexion.abrirConexion();
                MySqlCommand command = new MySqlCommand("RetornoPersonaPorIdCuenta", conexion.getConexion());
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@ForaneaPersona", FkPersonaCuenta);

                MySqlDataReader reader = command.ExecuteReader();
                
                if (reader.Read())
                {

                    _miUsuario = new Usuario();

                    _miUsuario.Nombre = reader.GetValue(0).ToString();
                    _miUsuario.SegundoNombre = reader.GetValue(1).ToString();
                    _miUsuario.Apellido = reader.GetValue(2).ToString();
                    _miUsuario.SegundoApellido = reader.GetValue(3).ToString();
                    _miUsuario.FechaNacimiento = Convert.ToDateTime(reader.GetValue(4).ToString());
                    _miUsuario.Cedula = reader.GetValue(5).ToString();
                    _miUsuario.Email = reader.GetValue(6).ToString();
                    _miUsuario.Pasaporte = reader.GetValue(7).ToString();
                  
                }

                return _miUsuario;
            }
            catch (MySqlException ex)
            {
                throw new BDCompraVueloExcepcion("ERROR:Ocurrio un error en la ejecucion del requerimiento:" + ex.Message);
            }
            finally
            {
                this.conexion.cerrarConexion();
            }
            return _miUsuario;
            
        }

        /// <summary>
        /// retorna las compras hechas por un usuario
        /// </summary>
        /// <param name="cuenta"></param>
        /// <returns></returns>
        public List<Compra> RetornoComprasCuenta(string cuenta)
        {
            try
            {
                conexion = new ConexionMySQL();
                conexion.abrirConexion();
                MySqlCommand command = new MySqlCommand("RetornoComprasCuenta", conexion.getConexion());
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@Usuario", cuenta);

                _milistaCompra = new List<Compra>();
                
                MySqlDataReader reader = command.ExecuteReader();


                while (reader.Read())
                {

                    _miCompra = new Compra();

                    _miCompra.FechaCompra = reader.GetValue(0).ToString();
                    _miCompra.MontoTotal = double.Parse(reader.GetValue(1).ToString());
                    _miCompra.Codigo = reader.GetValue(2).ToString();

                    _milistaCompra.Add(_miCompra);
                }

                return _milistaCompra;
            }
    
            catch (MySqlException ex)
            {
                throw new BDCompraVueloExcepcion("ERROR:Ocurrio un error en la ejecucion del requerimiento:" + ex.Message);
            }
            finally
            {
                this.conexion.cerrarConexion();
            }
            return _milistaCompra;
        }

        /// <summary>
        /// retorno idfactura que obtengo por pasar el id de la compra
        /// que muestro en el datagrid y con el login de la sesion
        /// paso la factura que esa compra genera
        /// </summary>
        /// <param name="numeroCompra"></param>
        /// <param name="cuenta"></param>
        /// <returns></returns>
        public int RetornoIdFacturaParametro(int numeroCompra ,string cuenta)
        {
            int respuesta = 0;

            try
            {
                conexion = new ConexionMySQL();
                conexion.abrirConexion();
                MySqlCommand command = new MySqlCommand("RetornoIdFacturaParametro", conexion.getConexion());
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@IdeCompra", numeroCompra);
                command.Parameters.AddWithValue("@Cuenta", cuenta);

                MySqlDataReader reader = command.ExecuteReader();

                if (reader.Read())
                    respuesta = Convert.ToInt16(reader.GetValue(0));

                reader.Close();
                conexion.cerrarConexion();
            }
            catch (MySqlException ex)
            {
                throw new BDCompraVueloExcepcion("ERROR:Ocurrio un error en la ejecucion del requerimiento:" + ex.Message);
            }
            finally
            {
                this.conexion.cerrarConexion();

            }
            return respuesta;
        }

        #endregion
    }
}